package pe.edu.upc.dew.bibliotecaweb.controller;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
import pe.edu.upc.dew.bibliotecaweb.model.Prestamo;
import pe.edu.upc.dew.bibliotecaweb.model.Reserva;
import pe.edu.upc.dew.bibliotecaweb.service.EjemplarService;
import pe.edu.upc.dew.bibliotecaweb.service.PrestamoService;
import pe.edu.upc.dew.bibliotecaweb.service.ReservaService;

/**
 *
 * @author DEW 2010
 * Acción encargada de realizar las validaciones y llamadas necesarias para llevar a cabo el registro de un préstamo y su devolución
 */
public class PrestamoAction extends org.apache.struts.action.Action {

    private static final String LOANACTION = "loanAction"; // Préstamo
    private static final String DEVACTION = "devAction"; // Devolución
    private PrestamoService prestamoService;
    private EjemplarService ejemplarService;
    private ReservaService reservaService;

    /**
     *Constructor de la clase PrestamoAction
     */
    public PrestamoAction() {
        this.prestamoService = new PrestamoService();
        this.ejemplarService = new EjemplarService();
        this.reservaService = new ReservaService();
    }

    /**
     * Lógica y validaciones para el registro de un préstamo y su devolución
     * Acciones:
     * LOANACTION      Acciones que redireccion a la página de préstamo.
     * DEVACTION       Acciones que redireccionan a la página de devolución.
     * @param mapping   permite realizar los redireccionamientos, en base a la asociación y configuración hecha en el archivo struts-config.xml.
     * @param form      permite acceder a los campos del formulario de Préstamo y Devolución (bookLoan - bookDevolution).
     * @param request   trae el request generado al realizar el submit desde el formulario de Reserva.
     */
    @Override
    public ActionForward execute(ActionMapping mapping, ActionForm form,
            HttpServletRequest request, HttpServletResponse response)
            throws Exception {

        PrestamoForm datosForm = (PrestamoForm) form;
        if (request.getParameter("idLibro") != null && !request.getParameter("idLibro").equals("") &&
                request.getParameter("idReserva") != null && !request.getParameter("idReserva").equals("") &&
                request.getParameter("fecha") != null && !request.getParameter("fecha").equals("")) {
            int idLibro = Integer.parseInt(request.getParameter("idLibro"));
            int idReserva = Integer.parseInt(request.getParameter("idReserva"));
            String fecha = request.getParameter("fecha").toString();
            int idEjemplar = ejemplarService.obtieneIdEjemplar(idLibro);

            if (prestamoService.registraPrestamo(idEjemplar, idReserva, fecha)) {
                datosForm.setMensajeR("Se registro el préstamo del libro correctamente.");
            } else {
                datosForm.setMensajeR("No se registro el préstamo.");
            }

            return mapping.findForward(LOANACTION);

        } else if (request.getParameter("idPrestamo") != null && !request.getParameter("idPrestamo").equals("") &&
                request.getParameter("fechaDevolucion") != null && !request.getParameter("fechaDevolucion").equals("") &&
                request.getParameter("idEjemplar") != null && !request.getParameter("idEjemplar").equals("")) {
            int idPrestamo = Integer.parseInt(request.getParameter("idPrestamo"));
            String fechaDevolucion = request.getParameter("fechaDevolucion").toString();
            int idEjemplar = Integer.parseInt(request.getParameter("idEjemplar"));

            if (prestamoService.registraDevolucion(idPrestamo, fechaDevolucion, idEjemplar)) {
                datosForm.setMensajeR("Se registró la devolución del libro correctamente.");
            } else {
                datosForm.setMensajeR("Se aplicará una penalidad al usuario por la devolución fuera de la fecha establecida.");
            }

            return mapping.findForward(DEVACTION);
        } else if (datosForm.getUsuarioPersona().length() != 0 && datosForm.getAccion().equals("P")) {
            String usuario = datosForm.getUsuarioPersona().toString().toLowerCase();
            Prestamo prestamo = prestamoService.buscaPrestamoUsuario(usuario);

            if (prestamo != null) {
                request.setAttribute("prestamo", prestamo);
                datosForm.setMensajeR("");
            } else {
                datosForm.setMensajeR("El usuario no tiene devoluciones pendientes.");
            }

            return mapping.findForward(DEVACTION);

        } else if (datosForm.getUsuarioPersona().length() != 0 && datosForm.getAccion().equals("R")) {
            String usuario = datosForm.getUsuarioPersona().toString().toLowerCase();
            Reserva reservaPendiente = reservaService.buscaReservaUsuario(usuario);

            if (reservaPendiente != null) {
                request.setAttribute("reservaPendiente", reservaPendiente);
                datosForm.setMensajeR("");
            } else {
                datosForm.setMensajeR("El usuario no tiene reservas generadas.");
            }

            return mapping.findForward(LOANACTION);
        } else {
            datosForm.setMensajeR("Por favor, realice la búsqueda de la reserva pendiente.");
            return mapping.findForward(LOANACTION);
        }

    }
}
